Algorithm($S[1 ... m]$, $N$):
if $N$ == $0$:
return Yes
if $N < 0$ or $S$ is empty:
return No
for $i$ from $1$ to $m$:
if Algorithm($S[1 ... m] - S[i]$, $N - S[i]$) returns Yes:
output $S[i]$
return Yes
return No
Algorithm($S[1 ... n]$, $B$)
Algorithm($G$):
choose any vertex $v \in G.V$ as start
return Hamilton-Visit($G$, $v$)
Hamilton-Visit($G$, $v$):
if count($V$.visited) == $|V|$:
return Yes
for each $u \in Adj[v]$ and $u.visited$ == False:
$u$.visited $:=$ True
if Hamilton-Visit($G$, $u$) returns Yes:
return Yes
return No
Algorithm($G$, $K$, $S$):
if Check-Dominating($G$, $K$, $S$):
return Yes
for each $v \in (G.V - S)$:
if Algorithm($G$, $K$, $S \cup \{ v \}$) returns Yes:
return Yes
return No
Check-Dominating($G$, $K$, $S$):
if $|S| > K$:
return False
for each $v \in (G.V - S)$:
flag $:=$ False
for each $s \in S$:
if $v \in Adj[s]$:
flag $:=$ True
break
if flag is False:
return False
return True
Algorithm($G$, $K$, $\phi$)